// Question.js - 题目数据模型
const mongoose = require('mongoose');

// 题目模式
const questionSchema = new mongoose.Schema({
  // 题目内容（支持文本/图片/富文本）
  content: {
    type: String,
    trim: true
  },

  // 富文本内容（HTML格式）
  htmlContent: { type: String },

  // 题目图片（存储文件路径或URL）
  image: { type: String },

  // 题目类型 (单选题、多选题、填空题、简答题等)
  type: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'QuestionType',
    required: [true, '题目类型不能为空']
  },

  // 选项 (支持文本/图片/富文本，允许为空)
  options: [{
    label: {
      type: String,
      trim: true,
      required: true
    },
    content: { type: String, trim: true },
    htmlContent: { type: String },
    image: { type: String },
    isCorrect: { type: Boolean, default: false }
  }],

  // 答案（支持文本/图片/富文本，多选题时为数组）
  answer: { type: [String], required: false },

  // 富文本答案（HTML格式）
  htmlAnswer: { type: String, required: false },

  // 答案图片（存储文件路径或URL）
  imageAnswer: { type: String, required: false },

  // 分值
  points: {
    type: Number,
    required: true,
    min: 0,
    default: 2
  },

  // 难度级别 (1-5)
  difficulty: {
    type: Number,
    required: [true, '难度不能为空'],
    min: [1, '难度最小值为1'],
    max: [5, '难度最大值为5'],
    default: 2
  },
  // 知识点标签
  tags: [{
    type: mongoose.Schema.Types.ObjectId,
    trim: true,
    required: [true, '题目来源不能为空']
  }],

  // 题目来源 (如：2024年春考、第一次月考等)
  source: [{
    type: mongoose.Schema.Types.ObjectId,
    trim: true,
    required: [true, '题目来源不能为空']
  }],
}, {
  // 添加时间戳字段,也即自动为文档添加 createdAt 和 updatedAt 两个字段
  timestamps: true,
  // 将数据库文档JSON序列化输出（同时控制字段顺序）， 是 JavaScript 标准的一部分
  // 也即当调用 JSON.stringify(doc) 或 res.json(doc) 时，Mongoose 会使用这个配置来控制输出的 JSON 格式
  // 举例，如果在控制器中有"console.log(JSON.stringify(user));"就会自动调用了 toJSON()
  toJSON: {
    //启用 虚拟字段（virtuals）
    virtuals: true,
    //允许在文档转成 JSON 之前，修改输出结构
    transform: function (doc, ret) {
      // 删除 _id 和 __v 字段
      delete ret._id;
      delete ret.__v;
      
      return ret;
    }
  },
  //当调用 doc.toObject() 时，也会使用这个配置
  //toObject 是 Mongoose 特定的方法，用于将文档转换为普通对象
  toObject: {
    virtuals: true
  }
});

// 虚拟字段 - 选项数量
questionSchema.virtual('optionsCount').get(function () {
  return this.options ? this.options.length : 0;
});

// 静态方法当然可以写在控制器中，但是写在这里增加了可重用性、易于测试
/**
 * 举例写在model和控制器的使用去呗
 * # controller.js 如过有下面的静态方法，那么调用如下
 * Question.findByDifficulty(2)
 *    .then(questions => {})
 *    .catch(err => {});
 * 
 * 否则，控制器中就应该写
 * # controller.js
 * exports.findByDifficulty = function(req, res, next) {
 *    const difficulty = req.params.difficulty;
 *    try {
 *       Question.findByDifficulty({ difficulty:difficulty })
 *       res.status(200).json(questions);
 *    }catch(err){
 *       res.status(500).json({message:err.message})
 *    }
 * }
 */
// 静态方法 - 按难度查询题目
questionSchema.statics.findByDifficulty = function (difficulty) {
  return this.find({ difficulty: difficulty });
};

// 静态方法 - 按标签查询题目
questionSchema.statics.findByTag = function (tag) {
  return this.find({ tags: tag });
};

// 创建模型
const Question = mongoose.model('Question', questionSchema);

module.exports = Question;
